# -*- encoding: utf-8 -*-
"""
@File    : 用户密码复杂度.py
@Time    : 2020/10/26 21:32
@Author  : lluyao
@Email   : lluyao61@163.com
@Software: PyCharm
"""
'''
用户密码复杂度验证(封装成函数)
·长度超过8位（必须）
·包括大、小写字母.数字.其它符号,以上四种至少三种
·不能有长度超过或等于3的子串重复
密码的评分等级，默认2分，以上条件满足一条加1分
·返回密码的评分等级，及要改进的点:
s
·如return 3,['长度小于8'，'密码没有由3种以上字符组成]

'''
# 用于检测特殊字符
import re

# 密码长度检测
def password_len(password1):
    if len(password1) >= 8:
        global grade
        grade += 1
        return grade
    else:
        return False

# 密码复杂度检测
def password_complex_rate(password2):
# 检测密码中是否有大写字母
    for i in password2:
        if i.isupper():
            result1 = "1"
            break
        else:
            result1 = "0"
# 检测密码中是否有小写字母
    for i in password2:
        if i.islower():
            result2 = "1"
            break
        else:
            result2 = "0"

# 检测密码中是否有数字
    for i in password2:
        if i.isdigit():
            result3 = "1"
            break
        else:
            result3 = "0"

# 检测密码中是否有特殊符号(\w => 0-9,_,a-z,A-Z)
    test_password = re.search(r"\W", password2)

    if test_password == None:
        result4 = "0"
    else:
        result4 = "1"

# 检测密码中是否包含大小写字母、数字或其它符号,以上四种中的至少三种
    result = result1 + result2 + result3 + result4

    count = result.count("1")
    if count >= 3:
        global grade
        grade += 1
        return grade
    else:
        return False

# 密码重复子串检测
def password_repetition(password3):
    for i in range(len(password3)):
        test_str = password3[i:i+3]

        if len(test_str) == 3:
            times = password3.count(test_str)

        if times != 1:
            break
    else:
        global grade
        grade += 1
        return grade


# 初始密码评分
grade = 2

password = input("请输入您的密码：")

if password_len(password):
    if password_complex_rate(password):
        if password_repetition(password):
            print(f"您的密码非常安全，密码安全评分为：{grade}分")
        else:
            print("您的密码中包含三个字符以上的重复字符")
            print(f"密码安全评分为：{grade}分")
    else:
        if password_repetition(password):
            print("您的密码没有包含大小写字母、数字或其它符号,以上四种中的至少三种")
            print(f"密码安全评分为：{grade}分")
        else:
            print("您的密码没有包含大小写字母、数字或其它符号,以上四种中的至少三种，而且包含三个字符以上的重复字符")
            print(f"密码安全评分为：{grade}分")
else:
    print("密码长度小于8位")
    print(f"密码安全评分为：{grade}分")